-
Notifications
You must be signed in to change notification settings - Fork 2
[PW_SID:1029060] RISC-V: Add PARAVIRT_SPINLOCKS support #1166
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: workflow__riscv__fixes
Are you sure you want to change the base?
Conversation
Add the files functions needed to support the SBI PVLOCK (paravirt qspinlock kick_cpu) extension. Implement kvm_sbi_ext_pvlock_kick_- cpu(), and we only need to call the kvm_vcpu_kick() and bring target_vcpu from the halt state. Reviewed-by: Leonardo Bras <[email protected]> Signed-off-by: Guo Ren (Alibaba DAMO Academy) <[email protected]> Signed-off-by: Linux RISC-V bot <[email protected]>
Add an unfair qspinlock virtualization-friendly frontend, by halting the virtual CPU rather than spinning. Using static_call to switch between: native_queued_spin_lock_slowpath() __pv_queued_spin_lock_slowpath() native_queued_spin_unlock() __pv_queued_spin_unlock() Add the pv_wait & pv_kick implementations. Reviewed-by: Leonardo Bras <[email protected]> Signed-off-by: Guo Ren (Alibaba DAMO Academy) <[email protected]> Signed-off-by: Linux RISC-V bot <[email protected]>
Add trace point for pv_kick&wait, here is the output:
ls /sys/kernel/debug/tracing/events/paravirt/
enable filter pv_kick pv_wait
cat /sys/kernel/debug/tracing/trace
entries-in-buffer/entries-written: 33927/33927 #P:12
_-----=> irqs-off/BH-disabled
/ _----=> need-resched
| / _---=> hardirq/softirq
|| / _--=> preempt-depth
||| / _-=> migrate-disable
|||| / delay
TASK-PID CPU# ||||| TIMESTAMP FUNCTION
| | | ||||| | |
sh-100 [001] d..2. 28.312294: pv_wait: cpu 1 out of wfi
<idle>-0 [000] d.h4. 28.322030: pv_kick: cpu 0 kick target cpu 1
sh-100 [001] d..2. 30.982631: pv_wait: cpu 1 out of wfi
<idle>-0 [000] d.h4. 30.993289: pv_kick: cpu 0 kick target cpu 1
sh-100 [002] d..2. 44.987573: pv_wait: cpu 2 out of wfi
<idle>-0 [000] d.h4. 44.989000: pv_kick: cpu 0 kick target cpu 2
<idle>-0 [003] d.s3. 51.593978: pv_kick: cpu 3 kick target cpu 4
rcu_sched-15 [004] d..2. 51.595192: pv_wait: cpu 4 out of wfi
lock_torture_wr-115 [004] ...2. 52.656482: pv_kick: cpu 4 kick target cpu 2
lock_torture_wr-113 [002] d..2. 52.659146: pv_wait: cpu 2 out of wfi
lock_torture_wr-114 [008] d..2. 52.659507: pv_wait: cpu 8 out of wfi
lock_torture_wr-114 [008] d..2. 52.663503: pv_wait: cpu 8 out of wfi
lock_torture_wr-113 [002] ...2. 52.666128: pv_kick: cpu 2 kick target cpu 8
lock_torture_wr-114 [008] d..2. 52.667261: pv_wait: cpu 8 out of wfi
lock_torture_wr-114 [009] .n.2. 53.141515: pv_kick: cpu 9 kick target cpu 11
lock_torture_wr-113 [002] d..2. 53.143339: pv_wait: cpu 2 out of wfi
lock_torture_wr-116 [007] d..2. 53.143412: pv_wait: cpu 7 out of wfi
lock_torture_wr-118 [000] d..2. 53.143457: pv_wait: cpu 0 out of wfi
lock_torture_wr-115 [008] d..2. 53.143481: pv_wait: cpu 8 out of wfi
lock_torture_wr-117 [011] d..2. 53.143522: pv_wait: cpu 11 out of wfi
lock_torture_wr-117 [011] ...2. 53.143987: pv_kick: cpu 11 kick target cpu 8
lock_torture_wr-115 [008] ...2. 53.144269: pv_kick: cpu 8 kick target cpu 7
Reviewed-by: Leonardo Bras <[email protected]>
Signed-off-by: Guo Ren (Alibaba DAMO Academy) <[email protected]>
Signed-off-by: Linux RISC-V bot <[email protected]>
The VM guests should fall back to a Test-and-Set spinlock when PARAVIRT_SPINLOCKS disabled, because fair locks have horrible lock 'holder' preemption issues. The virt_spin_lock_key would shortcut for the queued_spin_lock_- slowpath() function that allow virt_spin_lock to hijack it. ref: 43b3f02 ("locking/qspinlock/x86: Fix performance regression under unaccelerated VMs"). Add a static key controlling whether virt_spin_lock() should be called or not. Add nopvspin support as x86. Signed-off-by: Guo Ren (Alibaba DAMO Academy) <[email protected]> Signed-off-by: Linux RISC-V bot <[email protected]>
|
Patch 1: "[RFC,V3,1/4] RISC-V: paravirt: Add pvqspinlock KVM backend" |
|
Patch 1: "[RFC,V3,1/4] RISC-V: paravirt: Add pvqspinlock KVM backend" |
|
Patch 1: "[RFC,V3,1/4] RISC-V: paravirt: Add pvqspinlock KVM backend" |
|
Patch 1: "[RFC,V3,1/4] RISC-V: paravirt: Add pvqspinlock KVM backend" |
|
Patch 1: "[RFC,V3,1/4] RISC-V: paravirt: Add pvqspinlock KVM backend" |
|
Patch 1: "[RFC,V3,1/4] RISC-V: paravirt: Add pvqspinlock KVM backend" |
|
Patch 1: "[RFC,V3,1/4] RISC-V: paravirt: Add pvqspinlock KVM backend" |
|
Patch 1: "[RFC,V3,1/4] RISC-V: paravirt: Add pvqspinlock KVM backend" |
|
Patch 1: "[RFC,V3,1/4] RISC-V: paravirt: Add pvqspinlock KVM backend" |
|
Patch 1: "[RFC,V3,1/4] RISC-V: paravirt: Add pvqspinlock KVM backend" |
|
Patch 1: "[RFC,V3,1/4] RISC-V: paravirt: Add pvqspinlock KVM backend" |
|
Patch 1: "[RFC,V3,1/4] RISC-V: paravirt: Add pvqspinlock KVM backend" |
|
Patch 2: "[RFC,V3,2/4] RISC-V: paravirt: Add pvqspinlock frontend" |
|
Patch 2: "[RFC,V3,2/4] RISC-V: paravirt: Add pvqspinlock frontend" |
|
Patch 2: "[RFC,V3,2/4] RISC-V: paravirt: Add pvqspinlock frontend" |
|
Patch 2: "[RFC,V3,2/4] RISC-V: paravirt: Add pvqspinlock frontend" |
|
Patch 2: "[RFC,V3,2/4] RISC-V: paravirt: Add pvqspinlock frontend" |
|
Patch 2: "[RFC,V3,2/4] RISC-V: paravirt: Add pvqspinlock frontend" |
|
Patch 2: "[RFC,V3,2/4] RISC-V: paravirt: Add pvqspinlock frontend" |
|
Patch 2: "[RFC,V3,2/4] RISC-V: paravirt: Add pvqspinlock frontend" |
|
Patch 2: "[RFC,V3,2/4] RISC-V: paravirt: Add pvqspinlock frontend" |
|
Patch 2: "[RFC,V3,2/4] RISC-V: paravirt: Add pvqspinlock frontend" |
|
Patch 2: "[RFC,V3,2/4] RISC-V: paravirt: Add pvqspinlock frontend" |
|
Patch 2: "[RFC,V3,2/4] RISC-V: paravirt: Add pvqspinlock frontend" |
|
Patch 3: "[RFC,V3,3/4] RISC-V: paravirt: pvqspinlock: Add trace point for pv_kick/wait" |
|
Patch 3: "[RFC,V3,3/4] RISC-V: paravirt: pvqspinlock: Add trace point for pv_kick/wait" |
|
Patch 3: "[RFC,V3,3/4] RISC-V: paravirt: pvqspinlock: Add trace point for pv_kick/wait" |
|
Patch 3: "[RFC,V3,3/4] RISC-V: paravirt: pvqspinlock: Add trace point for pv_kick/wait" |
|
Patch 3: "[RFC,V3,3/4] RISC-V: paravirt: pvqspinlock: Add trace point for pv_kick/wait" |
|
Patch 3: "[RFC,V3,3/4] RISC-V: paravirt: pvqspinlock: Add trace point for pv_kick/wait" |
|
Patch 3: "[RFC,V3,3/4] RISC-V: paravirt: pvqspinlock: Add trace point for pv_kick/wait" |
|
Patch 3: "[RFC,V3,3/4] RISC-V: paravirt: pvqspinlock: Add trace point for pv_kick/wait" |
|
Patch 3: "[RFC,V3,3/4] RISC-V: paravirt: pvqspinlock: Add trace point for pv_kick/wait" |
|
Patch 3: "[RFC,V3,3/4] RISC-V: paravirt: pvqspinlock: Add trace point for pv_kick/wait" |
|
Patch 3: "[RFC,V3,3/4] RISC-V: paravirt: pvqspinlock: Add trace point for pv_kick/wait" |
|
Patch 3: "[RFC,V3,3/4] RISC-V: paravirt: pvqspinlock: Add trace point for pv_kick/wait" |
|
Patch 4: "[RFC,V3,4/4] RISC-V: paravirt: Support nopvspin to disable PARAVIRT_SPINLOCKS" |
|
Patch 4: "[RFC,V3,4/4] RISC-V: paravirt: Support nopvspin to disable PARAVIRT_SPINLOCKS" |
|
Patch 4: "[RFC,V3,4/4] RISC-V: paravirt: Support nopvspin to disable PARAVIRT_SPINLOCKS" |
|
Patch 4: "[RFC,V3,4/4] RISC-V: paravirt: Support nopvspin to disable PARAVIRT_SPINLOCKS" |
|
Patch 4: "[RFC,V3,4/4] RISC-V: paravirt: Support nopvspin to disable PARAVIRT_SPINLOCKS" |
|
Patch 4: "[RFC,V3,4/4] RISC-V: paravirt: Support nopvspin to disable PARAVIRT_SPINLOCKS" |
|
Patch 4: "[RFC,V3,4/4] RISC-V: paravirt: Support nopvspin to disable PARAVIRT_SPINLOCKS" |
|
Patch 4: "[RFC,V3,4/4] RISC-V: paravirt: Support nopvspin to disable PARAVIRT_SPINLOCKS" |
|
Patch 4: "[RFC,V3,4/4] RISC-V: paravirt: Support nopvspin to disable PARAVIRT_SPINLOCKS" |
|
Patch 4: "[RFC,V3,4/4] RISC-V: paravirt: Support nopvspin to disable PARAVIRT_SPINLOCKS" |
|
Patch 4: "[RFC,V3,4/4] RISC-V: paravirt: Support nopvspin to disable PARAVIRT_SPINLOCKS" |
|
Patch 4: "[RFC,V3,4/4] RISC-V: paravirt: Support nopvspin to disable PARAVIRT_SPINLOCKS" |
PR for series 1029060 applied to workflow__riscv__fixes
Name: RISC-V: Add PARAVIRT_SPINLOCKS support
URL: https://patchwork.kernel.org/project/linux-riscv/list/?series=1029060
Version: 3